硬件 Raid 卡相关
Table of Contents
1. 通用的知识
1.1. 硬盘相关的知识
发生读错误或写错误的扇区会被标记为坏扇区。确切地说处于「pending」状态。因为扇区的重映射仅在硬盘向被标为「pending」的扇区写入数据时发生,所以在读取失败的扇区被写入数据之前,它还没有进入硬盘内的坏扇区列表 (G 表) 中。
每个扇区除存储用户指定的数据之外,还存了本扇区数据的 ECC 校验码,用于校验和恢复本扇区内失真的用户数据。用 ECC 校验码恢复数据的过程由硬盘主控完成。ECC 校验失败且无法恢复就是读错误的一种情况,所以 ECC 校验失败且无法恢复的扇区会被按坏扇区处理。
1.2. 关闭或开启硬盘缓存
硬盘缓存指焊在硬盘电路板上的 RAM 颗粒,断电之后其中的数据丢失。
对于机械硬盘来说,在阵列卡配置中关闭硬盘缓存可以提升阵列的可靠性。因为,在开启缓存时,硬盘将数据放入缓存就向阵列卡报告写入成功,而如果断电发生在硬盘将缓存中的数据写入盘片之前,则导致数据丢失,阵列出现不一致。关闭缓存时,硬盘在把数据写入盘片之后才会向阵列卡报告写入成功,断电不会引起数据不一致。
但机械硬盘中的例外是叠瓦式硬盘,这类硬盘关闭缓存会导致写性能下降到几乎无法接受的程度,很容易出现 I/O 大量超时的问题,所以必须打开硬盘缓存以提高性能。
对于固态硬盘来说,必须在阵列卡配置中打开硬盘缓存以提高硬盘性能。由于阵列卡不支持 trim,所以必须打开固态硬盘的缓存来提升硬盘主控执行 gc 的速度,从而提升硬盘的性能。此外,遇到断电时,硬盘自带的电容中的电量可以让硬盘将缓存中的数据转移到 NAND 颗粒上,所以也不存在丢失固态硬盘缓存内的数据的问题。
由于阵列卡不支持 trim,所有不带缓存的固态又没有主动 gc 的能力,所以不带缓存的硬盘在阵列卡上连最低劣的性能都无法维持,会直接掉盘。
注: 关闭硬盘缓存指的是关闭硬盘的写入缓存,不论写入缓存是否开启,硬盘的读缓存都正常工作。读缓存由硬盘主控控制,用户无法配置。
2. LSI Raid 卡 (以 9271-8i 为例)
2.1. 软件工具
2.1.1. storcli64
storcli v6.14 是最后一个 v6 的版本,是 9271-8i 官方写明支持的最后一个版本的 storcli 工具。
storcli v6 支持使用 storcli64 /c<num> set patrolread maxconcurrentpd=<num>
来设置 Patrol Read 可以一次性处理的硬盘的数量 (默认 255),但无法显示该属性的值。必须要使用至少 0007.0209.0000.0000 版本的 storcli 工具才能让 storcli64 /c<num> show patrolread
也显示 maxconcurrentpd 这个属性。
storcli v6 在显示 CacheVault 的 Next Learn 属性的时候有 bug,v7 修了。
2.1.2. MSM 和 LSA
MSM (MegaRaid Storage Manager) 是 LSI 给 6G/s 的 Raid 卡开发的管理程序,使用本地的 GUI。
LSA (LSI Storage Authority) 是 LSI 给 12G/s 的 Raid 卡开发的管理程序,使用 WebUI。
MSM 从 17.05.03.00 开始需要用户手动安装 JRE 和相关的 java 依赖包,但这个 jar 包已经很久不维护了,而且所需版本的 JRE 不好找。最后一个不需要用户手动处理 JRE 和依赖关系的 MSM 的版本是 17.05.02.01。
但是这个版本无法从 Broadcom 官网下载,官网给的 URL 不对,访问会报 404。正确的下载链接是:
- 17.05.02.01_MSM_Windows.zip https://docs.broadcom.com/docs-and-downloads/docs-and-downloads/raid-controllers/raid-controllers-common-files/17.05.02.01_MSM_Windows.zip
- 17.05.02.01_MSM_Linux-x64.zip https://docs.broadcom.com/docs-and-downloads/docs-and-downloads/raid-controllers/raid-controllers-common-files/17.05.02.01_MSM_Linux-x64.zip
LSA 安装包里 README.txt 的兼容性描述里面没有 2xxx 系列的 6G/s 的芯片,只有 3xxx 系列的 12G/s 的芯片。
2.2. 替换坏盘的流程
如果蜂鸣器在响,可以先用 storcli64 /cx set alarm=silence
让蜂鸣器静音。(不是关闭蜂鸣器,不影响蜂鸣器再响)
- 坏盘离线
storcli64 /cx/ey/sz set offline
- 坏盘标记缺失
storcli64 /cx/ey/sz set missing
- 让坏盘停转
storcli64 /cx/ey/sz spindown
- 拔下坏盘,插入新盘
- 重建阵列:
- 如果打开了自动重建,新盘插入之后会自动开始重建。
storcli64 /cx show autorebuild
可以查看是否打开自动重建 - 如果没有打开自动重建,需要手动标记插入的硬盘
storcli64 /cx/ey/sz insert array=0 row=0
,array, row 的值可以从storcli64 /cx/dall show
的输出中获取。标记完成之后,重建会自动开始 - 对于老版本来说,在标记要加入到阵列的新盘之后,还必须手动开始重建
storcli64 /cx/ey/sz insert dg=0 array=0 row=0
(多一个 dg 参数) 标记插入到阵列的硬盘。dg, array, row 的值可以从storcli64 /cx/dall show
的输出中获取storcli64 /cx/ey/sz start rebuild
开始重建
- 如果打开了自动重建,新盘插入之后会自动开始重建。
另外,默认的重建阵列时的 I/O 压力是 30%,使用 storcli64 /cx set rebuildrate=<rate>
调高 I/O 压力 (1-100) 可以加快重建。
2.3. Patrol Read 和 Consistency Check (CC)
Patrol Read 作用于硬盘上每个可读的扇区。
Patrol Read 执行时,Raid 卡向硬盘发出 ATA read-verify(0x40) 命令来读取数据。这个命令不会让硬盘向 Raid 卡传输数据,而是让硬盘自行检测扇区数据。
如果 strip 中有硬盘报扇区读取错误,那么 Raid 卡就从属于同一个 strip 的其他硬盘上读数据 (读其他的 strip segment, strip parity 等数据),重建这个报错的这部分数据 (重建 strip segment 或 strip parity)。
数据重建后,使用 ATA write-verify(0x3C) 命令将重建好的数据写入报错的那个硬盘。命令执行成功后,继续验证下一个 strip (其他的扇区)。
Patrol Read 期间如果有无法重建的 strip,比如 Raid5 strip 中的 2 个 strip unit 报错,或者 Raid6 strip 中的 3 个 strip unit 报错,那么这个无法被重建的 strip 会被添加到 Bad Strip Table 中。
Patrol Read 也作用于热备盘。
CC 作用于阵列中使用 RAID 1, 5, 6, 10, 50 或 60 的 Virtual Drive (VD)。
CC 读取 VD 中的每一个 strip 并计算其所包含的数据是否一致。例如,在具有奇偶校验的系统中,检查一致性意味着计算一个硬盘上的数据,然后将结果与奇偶校验硬盘上的内容进行比较。
如果 CC 过程中硬盘报扇区读取错误,那此时 CC 行为与 Patrol Read 相同,即重建数据。
2.4. VD 相关
2.4.1. 在 WebBIOS 中创建的 VD 不能用 storcli64 获取其初始化进度
在 WebBIOS 中创建的 VD 默认使用 fast initialization,VD 立即可用,初始化 VD 的操作在后台进行。如果遇到重启,重启完成之后初始化继续,不会导致初始化重新开始。
但是这个初始化过程无法被 storcli64 /cx/vx show init
观察到。
2.4.2. 使用 storcli64 工具创建的 VD 必须手动初始化
使用 storcli64 命令创建 VD 之后并不会自动启动初始化进程,需要用户手动启动初始化。
2.4.3. 关闭 VD 中 PV 的缓存
在使用机械硬盘建立阵列时,关闭硬盘写入缓存可以有效提高阵列的可靠性。详见通用的知识一节。
关闭 PV 写入缓存的命令为:
storcli /c0/v<num> set pdcache=off
可以用 storcli64 /c0/v<num> show all
来查看 VD 状态,其中,表示 PV 写缓存策略的属性的名称为 Disk Cache Policy 其值应为 Disabled 。